package conservare.negocio;

import java.math.BigDecimal;

import javax.persistence.NoResultException;

import conservare.dao.BoletoDAO;
import conservare.modelo.banco.CarteiraBoleto;
import conservare.modelo.banco.SequencialBoleto;
import conservare.modelo.boleto.BoletoEmitido;
import conservare.util.CalculosUtil;

public class BoletoEmitidoRN {

	
	public static synchronized Integer gerarSequencialBoleto(CarteiraBoleto carteira){
		
		BoletoEmitidoRN boletoRN = new BoletoEmitidoRN();
		
		SequencialBoleto controleSequencialBoleto = boletoRN.getSequencialBoleto(carteira);
		
		Integer sequencial = controleSequencialBoleto.obterProximoSequencial();
		
		boletoRN.salvarSequencialBoleto(controleSequencialBoleto);
		
		return sequencial;
		
	}


	private BoletoDAO dao;
	
	public BoletoEmitidoRN(){
		this.dao = new BoletoDAO();
	}
	
	public BoletoEmitido salvar(BoletoEmitido boleto) {
		
		return dao.salvar(boleto);
		
	}


	public void salvarSequencialBoleto(SequencialBoleto sequencialBoleto) {
		this.dao.salvarSequencialBoleto(sequencialBoleto);
	}
	
	
	public BigDecimal calcularValorJurosMora(BigDecimal valorDoDocumento, BigDecimal percentualJurosMora){
		
		return CalculosUtil.calcularValorJurosDeMora(percentualJurosMora, valorDoDocumento);
		
	}
	
	public BigDecimal calcularValorMultaAposVencimento(BigDecimal valorDoDocumento, BigDecimal percentualMulta){
		return CalculosUtil.calcularValorMulta(percentualMulta, valorDoDocumento);
	}
	
	public SequencialBoleto getSequencialBoleto(CarteiraBoleto carteira){
		return dao.getSequencialBoleto(carteira);
	}
	
	

	
	public SequencialBoleto atualizarSequencialNossoNumero(SequencialBoleto nossoNumeroBancario) {
		
		return this.dao.atualizarSequencialNossoNumero(nossoNumeroBancario);
		
	}

	public BoletoEmitido obterBoletoPeloNossoNumero(String numeroDoBanco, String nossoNumero){
		try{
			return dao.obterBoletoPeloNossoNumero(numeroDoBanco, nossoNumero);
		}catch(NoResultException e) {
			return null;
		}
	}
	
	/*public BoletoViewer gerarBoleto(InfoBoleto infoBoleto, Carteira carteiraBoleto) throws Exception{
		
		GeradorBoleto geradorBoleto = null;
		
		geradorBoleto = GeradorBoletoFactory.criarGeradorBoleto(infoBoleto, carteiraBoleto);
		
		
		BoletoViewer boletoViewer = geradorBoleto.executar();
		
		infoBoleto.setNossoNumero(geradorBoleto.getNossoNumeroParaExibicao());
				
		return boletoViewer;
		
	}*/

}
